Помощь - Поиск - Пользователи - Календарь
Полная версия: Вопросы новичков
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103
Lirulin
shadowdweller, огромное спасибо! Я и сам понимаю, что с триггером проще, но видимо я там где-то тож лопухнулся в скрипте - и...
(я знаю, что тэги без кавычек rolleyes.gif )

Цитата(azathoth @ Jul 6 2008, 20:59) *
ну дык сделай чтобы рабатало, а не виласепедры придумывай.
1. не видно где устанавливается локалка
2. GetPCSpeaker() на онПерсепшен?

Устанавливалась в диалоге, в другом скрипте. Про Speaker - OnPerception - поправлю, вдруг получися. А придумывать велосипеды я престану, когда научусь нормально. Пока же я выкручиваюсь..
shadowdweller
Цитата(Lirulin @ Jul 6 2008, 20:35) *
(я знаю, что тэги без кавычек)

А я вот не знала. Сколько мучилась из-за этого... Теперь неосознанное стремление всем разжевать. smile.gif
Вот только единственное - НПС у меня не бежит, а вразвалочку прогулочным шагом идет. Слышала, что есть какая-то переменная
Neverwinter Script
int bRun
, но вот как задавать - не знаю...
Думаю, из более солидных специалистов кто поможет smile.gif
Lex
за отсутствием солидных спецов могу помочь я.
nRun - параметр в функции ActionMoveToObject (и всех других Move'ов), подробнее см. помощник в скрипт эдиторе или лексикон.
Lirulin
Цитата(shadowdweller @ Jul 7 2008, 03:19) *
А я вот не знала. Сколько мучилась из-за этого... Теперь неосознанное стремление всем разжевать. smile.gif
Вот только единственное - НПС у меня не бежит, а вразвалочку прогулочным шагом идет.

Ну, я вот хоть и знаю, а иногда забываю! Однажды скопировал нужный мне тэг из скрипта, придал этот тэг объекту (не помню, что это было), а кавычки забыл убрать. Долго не мог понять, почему не работает=)
А вроде еще можно просто скорость перемещения задать? float'ом... то ли после того, какой собсно, объект перемещается, писать этот float, то ли... не помню! unsure.gif
У меня у самого вразвалочку топают! (но им вроде бегать по статусу не положено, потому я не задумывался над этим=))
Lex
Если чару, то через Leto. biggrin.gif Скорость можно менять и через эффект. EffectMovementIncrease (и Decrease или что-то похоже. Поиск по слову movement рулит)
shadowdweller
Цитата(Lex @ Jul 7 2008, 09:09) *
nRun - параметр в функции ActionMoveToObject (и всех других Move'ов), подробнее см. помощник в скрипт эдиторе или лексикон.

Lex, спасибо огромное! По секрету, именно из скрипт-эдитора в тулсете я про эту функцию и узнала. Даже прочитала, перевела и догадалась, что она значит, правда! Проблема не в том, где найти, а в том, как пользоваться. Но твое внимание льстит, однозначно.
Lex
Цитата(shadowdweller @ Jul 7 2008, 13:43) *
Проблема не в том, где найти, а в том, как пользоваться.

pardon.gif проще, как говорится, некуда: ставишь TRUE - бежит. Ставишь FALSE (или ничего не ставишь) - не бежит. Думал такие вещи ты уже знаешь.

TINT: чтобы указать необязательный параметр у функции, необходимо обязательно указывать все параметры до него, даже если вас устраивают значения по умолчанию.

TINT2: обязательный параметр это тот параметр, который не имеет значения по умолчанию. Они идут первыми, только после того как закончатся все обязательные параметры, идут необязательные, со значением по умолчанию. Перемешать порядок параметров нельзя. Создавая свои функции, учитывайте это. Старайтесь, так же, ставить необязательные параметры в порядке частоты их изменения. Те тот парамерт, который чаще всего будет настраиваться разработчиком нужно ставить как можно раньше. Тот, который будет настраиваться редко, в самый конец списка.
Aiwan
Чертишь триггер, в таг триггера пишешь TR_CONV_ТАГ_ТВОЕГО_НПС Скрипт в слот на OnEnter. Имя триггера - фраза которую скажет НПС увидев РС. В свойствах KeyTag - больше 0 - подбежит. Все.
Neverwinter Script
//:://////////////////////////////////////////////
//:: OnEnter  am_ten_speak_npc
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  Текст над NPC  KeyTag - Количество раз.
  Если 0, то бесконечно. TAG НПС приписываем к
  четырем знакам к TAG-у триггера. НПС SubRace -
  анимации, НПС Deity - Длительность анимаций.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 21.04.2005
//:://////////////////////////////////////////////
void main()
{
object oPC = GetEnteringObject(); // PC
object oTrig = OBJECT_SELF;
string sTag = GetTag(oTrig); // Таг триггера  TR_SPK_
string sNPC = GetStringRight(sTag, (GetStringLength(sTag)- 7)); // Таг НПС
object oNPC = GetNearestObjectByTag(sNPC);
string sSpeak = GetName(oTrig); // Фраза
int i = StringToInt(GetLockKeyTag(oTrig)); // Количество раз
int iSp = GetLocalInt(oTrig, "SPEAK");
int iAnim = StringToInt(GetSubRace(oNPC)); // Анимации
float fAnim = StringToFloat(GetDeity(oNPC)); // Длительность анимаций
  if (!GetIsObjectValid(oNPC) || !GetIsPC(oPC) || iSp >= i && i!=0)
    {
    return;
    }
      AssignCommand(oNPC, ClearAllActions());
      AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oPC))))
;
      DelayCommand(1.0, AssignCommand(oNPC, SpeakString(sSpeak)));
      if (GetSubRace(oNPC)!="")
          {
          if (GetDeity(oNPC)=="")
          fAnim = 1.0;
          AssignCommand(oNPC, ActionPlayAnimation(iAnim, 1.0, fAnim));
          }
      if (i!=0)
      {
        SetLocalInt(oTrig, "SPEAK", (iSp+1));
      }
}


Есть скрипт для НПС, который будетбегать за РС и говорить типа: "Великий воин, последователь Темпуса! Подойди ко мне, базар есть!"

Настраивается дистанция. Напирмер, вы отбежали от НПС на 15 метров и все, он успокоился пока вас снова не увидит.
Ogneslav
Я тут недавно узнал что есть такая 2да таблица как hen_companion ( hen_familiar).
Вообщем я долго искал, и 2да.биф смотрел, но не нашел, кто может сказать как это таблица выглядит? scratch_one-s_head.gif
azathoth
Цитата
Вообщем я долго искал, и 2да.биф смотрел, но не нашел

наверное плохо смотрели, как раз там она и находится. (хотя для начала я всегда советовал бы заглядывать в xp2patch.bif и xp2.bif для последний версий тулсета).

получите и распишитесь:

hen_companion.2da
Код
2DA V2.0

    NAME       BASERESREF      STRREF  DESCRIPTION
0   Badger     NW_AC_BADGER     1993    5569
1   Wolf       NW_AC_WOLF       1578    5929
2   Bear       NW_AC_BEAR       1580    5986
3   Boar       NW_AC_BOAR       1577    5988
4   Hawk       NW_AC_HAWK       5989    5990
5   Panther    NW_AC_PANT       5991    5992
6   Spider     NW_AC_SPID       1573    5993
7   Direwolf   NW_AC_DWLF       10526   5994


hen_familiar.2da
Код
2DA V2.0

    NAME       BASERESREF      STRREF  DESCRIPTION
0   Bat        NW_FM_BAT       1995    5636
1   Panther    NW_FM_CRAG      5995    5996
2   Hellhound  NW_FM_HELL      5997    5998
3   Imp        NW_FM_IMP       5999    6000
4   Firemephit NW_FM_FIRE      6001    6002
5   Icemephit  NW_FM_ICE       6003    6004
6   Pixie      NW_FM_PIXI      6005    6007
7   Raven      NW_FM_RAVE      6008    6009
Lirulin
Цитата(Aiwan @ Jul 9 2008, 20:36) *
Есть скрипт для НПС, который будетбегать за РС и говорить типа: "Великий воин, последователь Темпуса! Подойди ко мне, базар есть!"
Настраивается дистанция. Напирмер, вы отбежали от НПС на 15 метров и все, он успокоился пока вас снова не увидит.

И он, этот скрипт, на Perception ставится, да? Или куда-то еще, а дистанция задается произвольно, независимо Perception'а NPC?
Ogneslav
Да, наверно действительно плохо искал.
Спасибо!
Xfans
Опять о триггерах и разговорах. Мы уже когда-то спрашивали тут, что делать с тем, что при 1 хенче реплика есть, при двух - нет=( Но это-то ладно... А как быть, если надо чтобы некоторые хенчи говорили что-то, а другие - нет? Только через их тэги устанавливать, какие говорят нужную фразу, а какие нет?
Lex
Да
Xfans
Спасибо! А если хенчи по расе отличаются, то через racial type можно? Или все равно только тэгами?
Ogneslav
Я недавно скачал СЕР 2.1 и начал разбираться с системой лошадок, практически во всем разобрался, но 1 вопрос остался, где брать радиальное меню, которое управляет этими лошадками?
Aiwan
Цитата(Lirulin @ Jul 10 2008, 00:48) *
И он, этот скрипт, на Perception ставится, да? Или куда-то еще, а дистанция задается произвольно, независимо Perception'а NPC?

Нет. Ставится на юзердеф. Perception срабаатывает и дает сигнал НПС дял скрипта. Надо?
shadowdweller
Очередной дурацкий вопрос из моей коллекции smile.gif

Хочу НПС OnSpawn прописать последовательность действий, которую он должен постоянно выполнять - пошел на первый вейп, сделал там что-нибудь, пошел на второй, постоял, пошел на третий, и так далее. Потом так же - обратно. Перешел к одному - действие - ко второму - действие, и т.д.
Как пишется анимация, я знаю и напишу. Вопрос в другом - нужно, чтобы НПС делал это все постоянно. Насколько я знаю, скрипт OnSpawn срабатывает только один раз. Как сделать, чтобы он работал постоянно. Вариант OnHeartbeat отпадает - за 6 секунд НПС с такой последовательностью действий не управится. Кам к мне поступить?
Ilerien
Я бы через хербит делал, только надо воткнуть туда проверку (мы рядом с нужным вейпом? да - делаем то, что надо, идём дальше, нет - выходим).
azathoth
можно вставить в экшен несколько экшенов, в том числе тот, который их вставляет... scratch_one-s_head.gif хз как сказать нормально - чтобы объяснить рекурсию нужно сначала объяснить рекурсию... так что пример:
Neverwinter Script
void DoItAgain()
{
    SetCommandable(TRUE);
    ActionMoveToLocation(...);
    ActionPlayAnimation(...);
    // ...
    // и прочие непотребства

    ActionDoCommand(DoItAgain());
    SetCommandable(FALSE); // а это чтобы наш "шатун" не отвлекался на настырного игрока
}

void main()
{
    // ещё какая-то инициализация по умолчанию
    // ...

    DoItAgain();
}
Aiwan
shadowdweller, Лекса пни. Он это делает на пять с плюсом. smile.gif
shadowdweller
Ну вот... Из трех советов до конца поняла только последний... Дядюшка Айв, не хочу я никого пинать, я хочу сама уметь. sad.gif Разжуйте мне, плиз, как для идиота, а? Хотя, почему - "как"? sad.gif

azathoth, спасибо smile.gif А то, что ты писал - куда ставится? На OnSpawn? И что такое "еще какая-то инициализация по умолчанию"? Это то, что в дефолтном скрипте может стоять? Есть, вообще, какие-то необходимые вещи, которые туда вписываются? С остальным, вроде, понятно более-менее.
azathoth
я скрипт не тестировал даже blum3.gif предупреждаю, просто показал вариант работы экшанов. Ставится на онСпаун, действительно, в других местах он будет не к месту. "инициализация по умолчанию" - это то что обычно у неписи в онСпаун стоит (много чего там, вроде задания лисниг паттернов использующихся для работы ИИ - наверно ж важно, я такие вещи предпочитаю руками не трогать). можно просто этот скрипт запустить кроме всего прочего.

Neverwinter Script
ExecuteScript("nw_c2_default9", OBJECT_SELF);


а вообще я бы тоже это через онХатбит бы сделал, т.е. заставляем непись выполнять одно из действий А Б С и т.д., записываем текущее действие (локальная переменная), в следующий запуск соотвественно смотрим переменную, проверяем и дошел ли вообще нпц до вейпойнта и посылаем его выполнять следующее действие.
shadowdweller
Придется пинать Лекса. Жестокие вы люди, господа...
Lex
сначала курим (правда там на примере UD скрипта, но логика у него точно такая же как и у HB в данном случае):
http://nwnmod.narod.ru/stat_anim_npc1.htm
http://nwnmod.narod.ru/stat_anim_npc2.htm
демо-модуль с кузнецами: http://www.wrg.ru/download.php?view.50
потом можно пнуть, только нежно.

зы: делайте скидку на время написания, это было давно, некоторые конструкции или подходы уже могли устареть.
Aiwan
Вот модуль, в нем используется стандартные еванты. Посмотри любого НПС у него в слотах спавна и юзердеф и хертбит стоят мои скрипты. Твоя задача на парне который занимается ковром (в моем модуле он шкипер). Анимацию можешь сама изменить. В принципе, в этом модуле достаточно стандартных действий НПС что бы ты могла оживить весь модуль. Очень внимательно прочитай скрипт am_csp_common - в нем подробно распиано что будет делать НПС в том или ином случае. На НПС надо вешать локалки типа FLAG_RANGED и НПС становится атакующим рейнджером:
Neverwinter Script
//==================================================
============================

//      Атакующие свойства НПС - устанавливается ТОЛЬКО ОДНО ИЗ НИХ!
//==================================================
============================

    //--------------------------------------------------------------------------
    //  Старается атаковать издали, дальнобойным оружием.
    //--------------------------------------------------------------------------
    if (GetLocalInt(OBJECT_SELF, "FLAG_RANGED") == TRUE)
        {SetCombatCondition(X0_COMBAT_FLAG_RANGED);}
    //--------------------------------------------------------------------------
    //  Использует защитные фиты и паррирование
    //--------------------------------------------------------------------------
    if (GetLocalInt(OBJECT_SELF, "FLAG_DEFENSIVE") == TRUE)
        {SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE);}
    //--------------------------------------------------------------------------
    //  Будет невидимым и попытается атаковать, выйдет из невидимости и снова
    //  будет пытаться атаковать.
    //--------------------------------------------------------------------------
    if (GetLocalInt(OBJECT_SELF, "FLAG_AMBUSHER") == TRUE)
        {SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER);}
    //--------------------------------------------------------------------------
    //  При атаке убегает
    //--------------------------------------------------------------------------
    if (GetLocalInt(OBJECT_SELF, "FLAG_COWARDLY") == TRUE)
        {SetCombatCondition(X0_COMBAT_FLAG_COWARDLY);}


Либо стандартные еванты. ЧТо бы НПС замечал игрока, и прочее, надо ему раскомментировать свойства. Например хертбит запускаем так: присваиваем на НПС локалку FLAG_HEARTBEAT == 1 в свойствах на локации. В общем смотри НПС там все расписано с комментариями..
Neverwinter Script
//==================================================
============================

//                  Запускаем стандартные еванты на НПС
//==================================================
============================

    //--------------------------------------------------------------------------
    // Если вы присвоите локальную переменную "FLAG_USER_DEFINED_EVENT" равную
    // TRUE, то все еванты присвоятся сразу. В противном случае присваивайте
    // По одному для каждого события.
    //--------------------------------------------------------------------------
    int iUserDef = GetLocalInt(OBJECT_SELF, "FLAG_USER_DEFINED_EVENT");

    // * Fire User Defined Event 1001 in the OnHeartbeat
    if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_HEARTBEAT") == TRUE)
        {SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);}

    // * Fire User Defined Event 1002
    if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_PERCIEVE") == TRUE)
        {SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT);}

Нажмите для просмотра прикрепленного файла
shadowdweller
Спасибо, Айв!

*Утащила мод, обернулась, не видел ли кто, и пошла ковырять* smile.gif
Lirulin
Вот помню, что об этом уже спрашивали, но не могу найти, где это было - как организовать проверку на то, наступила ли в игре определенная дата?

Цитата(Aiwan @ Jul 10 2008, 23:09) *
Нет. Ставится на юзердеф. Perception срабаатывает и дает сигнал НПС дял скрипта. Надо?

Надо, надо! Полезный скрипт лишним не бывает!!!
Ilerien
Есть функции GetCalendarYear/Month/Day. Соотвественно, нужно проверять
Neverwinter Script
if(GetCalendarYear() > <год> || (GetCalendarYear() == <год> && GetCalendarMonth() > <месяц>)  || (GetCalendarYear() == <год> && GetCalendarMonth() == <месяц> && GetCalendarDay() >= <день>))
    ...
Lirulin
Цитата(Ilerien @ Jul 25 2008, 13:13) *
Есть функции GetCalendarYear/Month/Day. Соотвественно, нужно проверять
Neverwinter Script
if(GetCalendarYear() > <год> || (GetCalendarYear() == <год> && GetCalendarMonth() > <месяц>)  || (GetCalendarYear() == <год> && GetCalendarMonth() == <месяц> && GetCalendarDay() >= <день>))
    ...


Ну вот, а я искал, искал... (учить надо unsure.gif ). Спасибо! Пошел делать дальше!
Артём
У меня вопрос про скрипт который вылажен на "Скрипты для новичков"
И вот в первом скрипте я уже сильно напутал smile.gif
Цитата
CreateItemOnObject("ResRef_cloth025", oPC, 1);

Как я понел надаобыло писать так, но почемуто вешь вобше непоевляется в инвинтаре а вот если написать...
Цитата
CreateItemOnObject("NW_CLOTH024", oPC, 1);

если писать только тег, то вещь появляется но не одевается при входе в игру...

Вот скрипт попрошу показать где я намудрил crazy.gif (я даже самые элементарные скрипты незнаю потому просто вырезаю всё ненужное и надеюсь, что это будит рабтоть rolleyes.gif )

Цитата
void main()
{
object oMod = GetModule();
object oPC = GetEnteringObject();

if (!GetIsPC(oPC) || GetLocalInt(oMod, "START_GAME"))
{return;}
{
SetLocalInt(oMod, "START_GAME", TRUE);


object oItem = GetFirstItemInInventory(oPC);
while(GetIsObjectValid(oItem))
{
DestroyObject(oItem);
oItem = GetNextItemInInventory(oPC);
}


int i=0;
while(i<14)
{
DestroyObject(GetItemInSlot(i, oPC)); //
i++;

}

CreateItemOnObject("NW_CLOTH027", oPC, 1);



object oItemCr = GetFirstItemInInventory(oPC);
while(GetIsObjectValid(oItemCr))
{
SetIdentified(oItemCr,TRUE);
oItemCr = GetNextItemInInventory(oPC);
}

{
SetXP(oPC, 15);
}


AssignCommand(oPC, ActionEquipMostEffectiveArmor());

}
}
Zirrex
Артём, эта функция создает вещи не по тэгу, а по резрефу вещи. Поэтому по стандарту во всех вещах и объектах Биовари тэг = резрефу, чтобы не было путаницы. Чтобы твоя вещь создалась, сделай тэг и резреф одинаковыми. Например: тэг = ait_item_armor, резреф = ait_item_armor (резреф ограничен 16 символами). И не делай такие тэги, иначе быстро запутаешься, что у тебя за вещь, если будешь их просматривать по резрефам.

Так ты не указал, какую именно вещь нужно одеть. Потом, необходима мелкая задержка между созданием и одеванием вещи, потому что функция "CreateItemOnObject" более медленная, чем функция "ActionEquipItem" или "ActionEquipMostEffectiveArmor". Да, вот еще что. Вещи не одеваются на эвенте входа. Они хорошо одеваются на эвенте локации. Сам уже не раз наступал на эти грабли. Попробуй свой скрипт повесить на эвент локации входа. Вот как я одеваю вещи на нового персонажа:

Neverwinter Script
void ClientGiveClothers(object oPC, float fDelay)
{
    string sClass, sItem;
    object oClother;

    // Выдача одежды игроку
    switch (GetClassByPosition(1, oPC))
    {
        case CLASS_TYPE_BARBARIAN:  sClass = "barbarian"break;
        case CLASS_TYPE_FIGHTER:    sClass = "fighter";    break;
        case CLASS_TYPE_MONK:      sClass = "monk";        break;
        case CLASS_TYPE_PALADIN:    sClass = "paladin";    break;
        case CLASS_TYPE_RANGER:    sClass = "ranger";      break;
        case CLASS_TYPE_ROGUE:      sClass = "rogue";      break;
        case CLASS_TYPE_BARD:      sClass = "bard";        break;
        case CLASS_TYPE_CLERIC:    sClass = "cleric";      break;
        case CLASS_TYPE_DRUID:      sClass = "druid";      break;
        case CLASS_TYPE_SORCERER:  sClass = "sorcerer";    break;
        case CLASS_TYPE_WIZARD:    sClass = "wizard";      break;
    }

    if (GetGender(oPC) == GENDER_FEMALE)    sItem = "ac_" + sClass + "_f";
    else                                    sItem = "ac_" + sClass + "_m";

    if (GetItemPossessedBy(oPC, sItem) == OBJECT_INVALID)  oClother = CreateItemOnObject(sItem, oPC);
    if (oClother == OBJECT_INVALID) oClother = GetItemPossessedBy(oPC, sItem);
    DelayCommand(fDelay, AssignCommand(oPC, ActionEquipItem(oClother, INVENTORY_SLOT_CHEST)));
}

Задержка fDelay=0.1 секунда.

Функция вызывается из общего тела скрипта в конце твоего условия:
Neverwinter Script
object oPC = GetEnteringObject();
...
ClientGiveClothers(oPC, 0.1);
Артём
Большое спасибо за внятный ответ good.gifsmile.gif сейчас буду пробовать
Zirrex
Артём, поправил твой скрипт. Проверяй. Только не забудь его повесить на событие входа в локацию. Сделай для стартовой локации отдельный скрипт.

Neverwinter Script
void main()
{
    object oPC = GetEnteringObject();
    object oArea = GetArea(oPC);

    if (GetIsPC(oPC) == FALSEreturn;
    if (oArea == OBJECT_INVALID)    return;

    if (GetXP(oPC) == FALSE)
    {
        // Удаление вещей с персонажа
        int s;
        object oSlot;

        for (s = 0; s < 18; s++)
        {
            oSlot = GetItemInSlot(s, oPC);
            if (GetIsObjectValid(oSlot)) DestroyObject(oSlot);
        }

        // Удаление вещей из рюкзака персонажа
        object oItem = GetFirstItemInInventory(oPC);

        if (oItem != OBJECT_INVALID)
        {
            while (GetIsObjectValid(oItem))
            {
                DestroyObject(oItem);
                oItem = GetNextItemInInventory(oPC);
            }
        }
        // выдачи вещи
        object oClother = CreateItemOnObject("NW_CLOTH027", oPC, 1);
        // установка флага для всех вещей в рюкзаке "Определенные"
        object oItemCr = GetFirstItemInInventory(oPC);

        while(GetIsObjectValid(oItemCr))
        {
            SetIdentified(oItemCr, TRUE);
            oItemCr = GetNextItemInInventory(oPC);
        }
        // не проще сразу выдавать определенные вещи? Лишний цикл

        SetXP(oPC, TRUE);
        // на персонажа одевается выданная вещь
        DelayCommand(0.1, AssignCommand(oPC, ActionEquipItem(oClother, INVENTORY_SLOT_CHEST)));
        // сохранение персонажа
        DelayCommand(2.0, ExportSingleCharacter(oPC));
    }
}

Переменная не нужна. Дело все том, что если эта система предназначена для шарда, то после рестарта у твоего персонажа снова заберут вещи, выдадут заново вещь, определят ее и дадут персонажу 15 опыта, затерев то значение, которое будет. Простая проверка на 0. Если опыт равен 0, то выполнить условие, если нет, то пропустить. Потом нужно следить, чтобы опыт никогда не был 0.
shadowdweller
Zirrex, а если получится так, что в стартовую локацию придется входить не один раз, а несколько, и каждый раз с бедного игрока будут сдирать одежду и рюкзак ему чистить? smile.gif Это я к тому, что, может, стоит переменную повесить на то, входил игрок уже в локу или нет?
У меня работает так:
Neverwinter Script
#include "nw_i0_tool"
void main()
{
object oEnter = GetEnteringObject();

if (!GetIsPC(oEnter)) return;

//вот как раз наша переменная. проверяем, не произошло ли уже это событие
int DoOnce = GetLocalInt(oEnter, GetTag(OBJECT_SELF));
// если да - скрипт не сработает, если нет - продолжаем действовать.
if (DoOnce==TRUE) return;
// устанавливаем переменную, что игрок уже однажды вошел на локацию.
SetLocalInt(oEnter, GetTag(OBJECT_SELF), TRUE);
// а дальше уже можно чистить инвентарь и проделывать с игроком все, что угодно

Заранее извиняюсь, если сморозила глупость smile.gif
Артём
Спасибо обоим smile.gif
Что то меня эти скрипты пугают, не берусь их учить, только лазию и ПОРОШАЙНИЧЯЮ да и варую чюжые скрипты crazy.gif
Zirrex
shadowdweller, а это еще почему? Такая система работает уже несколько лет, и ничего с бедного игрока не сдирали. Переменная стирается рестартом, а игрок входит на шард всегда через стартовую локацию, поэтому твоя правка бесполезна. Достаточно двух строк:

Neverwinter Script
void main()
{
...
    if (GetXP(oPC) == FALSE)
    {
        SetXP(oPC, TRUE);
    }
}

Даже если игрок и не покинет эту локацию сразу, а перезайдет на ней, то он останется ровно с тем, что ему дали.

Если уж говорить о полной надежности, то персонажу игрока нужно выдавать вещь, на которую сохранять стартовую переменную и потом ее проверять вместе со значением опыта. Одно условие может быть FALSE, оба - сомневаюсь.
shadowdweller
Zirrex, ну, если о шарде речь - тогда совсем другое дело. Я-то сингл имела в виду. smile.gif Причем, я так боялась, что это будет каждый раз происходить, что в моде на стартовую локацию можно только один раз зайти, если вышел - все, не вернешься biggrin.gif
Zirrex
shadowdweller, а причем тут одиночная игра? Там еще проще. Можно всегда сохранить статус игры. Потом, именно в одиночной игре подобные скрипты вешаются на события модуля, а не локации, чтобы, как ты описала выше, не было подобных эксцессов.
Артём
Вопрос есть скрипт который позволяет не сбивать действия? К примеру у меня НПС посли диалога идёт в указанное место, но при попытке поговорить с ним ВСЁ он стоит ступором и несоберается выполнять задоный скрипт.

P.S
Надеюсь я не сильно много задают вопросов? С таким темпом могу быстро вам надоесть smile.gif
Melisse
Тебе нужно в хербите НПС ставить проверку GetDistanceToObject(бла,бла) >=1.0 до объекта куда нужно и если он не там пинать его командой AssignCommand(<НПС>, ActionMoveToObject(бла)); ну и соответсвующие проверки на - болтает ли, дерется, идет ли
что-то типа такого:
Neverwinter Script
....
if(GetLocalInt(...)==...)это ты в диалоге вешаешь...а в хербите если есть локалка запуститься следующие
{
oObject = <твоя точка назначения>
if(!GetIsInCombat(OBJECT_SELF) && !IsInConversation(OBJECT_SELF))
{
  if(GetDistanceToObject(oObject)>=1.5)
  {
   AssignCommand(OBJECT_SELF, ActionMoveToObject(oObject));
  }
}
}
....
Артём
А можно как нибудь поподробней для чайника. можно целый скрипт?
Melisse
Берешь с слота OnHerbit у НПС скрипт и в самом начале пишешь:

Neverwinter Script
if(GetLocalInt(OBJECT_SELF,"QUEST")==TRUE)
{
object oObject = GetObjectByTag("СЮДА ТЭГ ОБЪЕКТА, К КОТОРОМУ НАДО ИДТИ");
if(!GetIsInCombat(OBJECT_SELF) && !IsInConversation(OBJECT_SELF))
{
  if(GetDistanceToObject(oObject)>1.0)
  {
   AssignCommand(OBJECT_SELF, ActionMoveToObject(oObject));
  }
  else DeleteLocalInt(OBJECT_SELF,"QUEST");
}
}


и в диалоге на в тот скрипт что заставляет НПС идти к точке назначения вставь
Neverwinter Script
SetLocalInt(OBJECT_SELF,"QUEST",TRUE);


должно сработать
Артём
Спасибо сейчас буду тыкать smile.gif
Lordeath
Куча вопросов по реализации некоторых идей =)
Буду благодарен если мне подскажут как все сделать или кинут ссылку где это описано.
1. Появление разных рас в разных местах при первом заходе в модуль. То есть например эльфы начинают в одной локации, а люди в другой.
2. Видел в каком то модуле что была настроена рассовая агрессия. Тк модуль будет ориентирован на мультиплеер нужно сделать так чтобы союз одних рас был агрессивен по отношению к союзу других.
3. Еще хотел бы узнать как реализовать отдельный респаун каждого союза в своем городе.
4. Начисление опыта и золота за убийство игрока. ну например по формуле lvl убитого игрока x 50 , если если убитый игрок на 5 уровней ниже то опыт и золтто не дается.

Фух, пока все, надеюсь что сильные скриптеры мира сего помогут =)
Ogneslav
Цитата
1. Появление разных рас в разных местах при первом заходе в модуль. То есть например эльфы начинают в одной локации, а люди в другой.


было-бы не плохо не только по рассе, но еще и по классу(мне для сингла).

Цитата
Еще хотел бы узнать как реализовать отдельный респаун каждого союза в своем городе.


тоже было-бы интересно.
Melisse
1. Да это то просто.
тригер ставишь в локе где появляются игроки и прямо под точку захода в модуль.
Таких скриптов тут на форуме множество - поищите поиском.
На онЭнтер тригерра ставить что-то типа такого:

Neverwinter Script
object oPC = GetEnteringObject();
object oPoint;
int nRace = GetRaticalType(oPC);


switch(nRace)
{

case RATICAL_TYPE_ELF://Если еще и по классам то сюда еще один switch просто с классами и все
{
  oPoint = GetObjectByTag("Тэг точки");
DelayCommand(1.0,AssignCommand(oPC,JumpToObject(oPoint));
break;
}
case RATICAL_TYPE_HUMAN:
.....

}


2. Не поняла, чего надо?
Lordeath
Допустим сделать так чтобы игроки-люди по умолчанию были агрессивны к игрокам-полуоркам.

За первое спасибо большое.
Ilerien
Второе - ставим на onClientEnter модуля
Neverwinter Script
void main()
{
    object oPC = GetEnteringObject();
    object oOtherPC = GetFirstPC();
    int nRace = GetRacialType(oPC);
    int nOtherRace;
   
    while(GetIsObjectValid(oOtherPC))
    {
        nOtherRace = GetRacialType(oOtherPC);
        if((nOtherRace == RACIAL_TYPE_HUMAN && nRace == RACIAL_TYPE_HALFORC) ||
            (nRace == RACIAL_TYPE_HUMAN && nOtherRace == RACIAL_TYPE_HALFORC))
            SetPCDislike(oPC, oOtherPC);
        oOtherPC = GetNextPC();
    }
}
За способность скомпилиться не ручаюсь - не тестил. Остальное завтра - хочу спать smile.gif
Lordeath
Благодарю, попробую.
Цитата
#include "botd_teams"

int StartingConditional()
{
object oPC = GetPCSpeaker();
int nTeam = GetTeamNumber(oPC);
int nToken;
if (nTeam == BOTD_ANIEL)
nToken = 5101;
else if (nTeam == BOTD_ROSHNAK)
nToken = 5201;
else
return FALSE;

switch (GetBonusLevel(nTeam))
{
case 0:
SetCustomToken(nToken,"unexperience. We need more funds to adequately train them.");
break;
case 1:
SetCustomToken(nToken,"junior. We need more funds to adequately train them.");
break;
case 2:
SetCustomToken(nToken,"novice. We need more funds to increase their skills.");
break;
case 3:
SetCustomToken(nToken,"advanced. More funds will ensure they are in superb condition.");
break;
case 4:
SetCustomToken(nToken,"experienced. More funds will ensure they are in superb condition.");
break;
case 5:
SetCustomToken(nToken,"superior. More funds will ensure they are in superb condition.");
break;
case 6:
SetCustomToken(nToken,"vertan. More funds will ensure they are in superb condition.");
break;
case 7:
SetCustomToken(nToken,"elite. More funds will ensure they are in superb condition.");
break;
case 8:
SetCustomToken(nToken,"ultra-elite. More funds will ensure they are in superb condition.");
break;
case 9:
SetCustomToken(nToken,"maximized. There is no more advancement available.");
break;
}
return TRUE;
}

Вот разбирал тут по кусочкам один модуль, возник вопрос - не могу заменить в скрипте фразы которые в кавычках русскими словами. Это галюн именно моего редактора или Авроры в целом?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.